package Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
*JDK8之后集合提供了一个新的方法：foreach，可以使用lambda表达式遍历集合元素，
 */
public class ForeachDemo {
    public static void main(String[] args) {
      //  Collection <String>c =new ArrayList<>();
        List<String >c=new ArrayList<>();
        c.add("sdsad");
        c.add("sds");
        c.add("sdfrgdfd");
        c.add("sdsdfg");
        c.add("DFDad");
        c.add("sdsDSSDd");
        c.add("sdSDFDFGXd");
        /*
        集合有多少个元素，就会调用lambda表达式多少次，而每次调用时e表示的就是其中一个元素
         */
        c.forEach(e->System.out.println(e));
        /*
            forEach方法出现的背景
            我们常用的集合:ArrayList,LinkedList,HashSet都不是线程安全的

            借助Collections的对应方法:synchronizedList(),synchronizedSet(),synchronizedCollection()
            将现有的集合转换为一个并发安全的集合。

            就算是一个并发安全的集合，它的add,remove等操作都有synchronized修饰，也不会与迭代器
            互斥。原因是迭代器是一个单独的对象，不是通过集合自身的方法遍历，因此无法做到迭代器的
            方法与集合的方法互斥！此时就需要自行使用同步块维护迭代器遍历与集合自身操作的互斥，来保证
            并发安全。

            JDK8之后推出的forEach方法，是集合自身的遍历方法，因此可以和集合自身的add,remove等
            操作互斥，直接保证了并发安全。

         */
        List syncList = Collections.synchronizedList(c);
//        以下三个方法是互斥的，保证多线程并发安全
//        syncList.add();
//        syncList.remove();
//        syncList.forEach();

    }
}
